#include <signal.h>
#include <unistd.h>
#include <iostream>

using std::cout;
using std::endl;

bool loop = true;

void Print(sigset_t &pending)
{
    for (int sig = 31; sig > 0; sig--) // 没有0号信号，信号的范围1——31，两闭
    {
        if (sigismember(&pending, sig))
        {
            cout << 1;
        }
        else
        {
            cout << 0;
        }
    }
    cout << endl;
}
void donesig2(int sig)
{
    cout << "get sig 3" << endl;
    cout << "loop = false, done sig2" << endl;
    loop = false;
}

void sigcb(int sig)
{
    loop = true;
    cout << "get a sig:" << sig << endl;
    while (loop)
    {
        sigset_t pending;
        sigpending(&pending);
        Print(pending);
        sleep(1);
    }
}

// void sigtest(int sig)
// {
//     cout<<"get a sig :"<<sig<<endl;
//     while(1)
//     {

//     }
// }

// int main()
// {
//     struct sigaction ac, oac;

//     ac.sa_flags = 0;
//     sigemptyset(&ac.sa_mask);
//     sigaddset(&ac.sa_mask,2);
//     sigaddset(&ac.sa_mask,40);
//     ac.sa_handler = sigcb;

//     while (true)
//     {
//         sigaction(3, &ac, &oac);
//         sleep(1);
//         cout << "I am process:" << getpid() << endl;
//     }

//     return 0;
// }



//使用sigprocmask屏蔽2和40号信号
int main()
{
    sigset_t bset,obset;
    sigemptyset(&bset);
    
    sigaddset(&bset,2);
    sigaddset(&bset,40);

    //block 2 和 40 号信号
    sigprocmask(SIG_SETMASK,&bset,&obset);

    for(int i = 0;i < 5;++i)
    {
        cout<<"kill -2"<<endl;
        kill(getpid(),2);
        cout<<"kill -40"<<endl;
        kill(getpid(),40);
        sleep(1);
    }

    return 0;
}
